import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from ..items import *


"""


目的
通过crawl_spider爬取某部小说的 章节内容 保存为txt文件 

流程 
1确认url
2.直接在LinkExtractor里面写匹配二级目录url的语法(xpath,re)
3在parse_item进行数据清洗 
# 传入管道 保存 
scrapy是高并发 多线程的 爬虫框架 执行顺序是无序的 
"""
# 爬虫类 继承 CrawlSpider 作用自动发送请求
class XsSpider(CrawlSpider):
    # 爬虫名字
    name = 'xs'
    # 允许的域名
    allowed_domains = ['xbiquge.la']
    # 起始url
    start_urls = ['https://www.xbiquge.la/7/7552/']
    # rules复数 多个作用 存储匹配url规则对象
    rules = (
        # 链接提取器提取到了链接 如果是残缺的 crawl会自动进行拼接
        # 每个匹配url规则对象    匹配url的重点 只需要指定有url的节点位置即可 不需要指定文本数据 属性数据
        Rule(LinkExtractor(restrict_xpaths='//*[@id="list"]/dl/dd[*]/a'), callback='parse_item',),
    #LinkExtractor链接提取器    重点 重点
    #     allow 表示提取链接的规则(通过正则提取url)     如果匹配到了链接则发送请求
    #     deny 表示不提去链接的规则 (通过正则提取url)   如果匹配到了链接则不发送请求
    #     restrict_xpaths 提取链接的方法 (通过xpath进行提取) 只需要指定链接的节点 不需要指定文本数据 属性数据
    #callback      回调函数   可选参数
    #follow   表示本次匹配完url以后 是否需要再次进行匹配   主要作用到 scrapy进行翻页操作使用
    )
    def parse_item(self, response):
        item=XiaoshuoItem()
        title=response.xpath('//div[@class="bookname"]/h1/text()').get()
        print(title)
        contents=response.xpath('//*[@id="content"]/text()').getall()
        print(contents)
        item["title"]=title
        item["contents"]=contents
        # 自带的item对象只是一个普通的字典    需要进行数据的传递 就得手动进行items载体对象构建
        #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
        #item['name'] = response.xpath('//div[@id="name"]').get()
        #item['description'] = response.xpath('//div[@id="description"]').get()
        return item
